package com.sxpi.user.feign.api;

import com.sxpi.user.dto.LoginFaceDto;
import com.sxpi.user.dto.LoginTeDto;
import com.sxpi.user.dto.LoginDto;
import com.sxpi.user.dto.UserDto;
import com.sxpi.common.result.R;
import com.sxpi.user.vo.UserAmountVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

/**
 * @Author: 董伟豪
 * @Date: 2022/10/2 17:32
 * 定义Feign的接口
 */
@FeignClient(name = "sxpi-service-user")
public interface UserServiceFeign {

    /**
     * 用户登录获取openid
     * @param loginVo
     * @return
     */
    @PostMapping("/user/login")
    R login(@RequestBody LoginDto loginVo);

    /**
     * 更新手机号码更新信息
     * @param loginTeVo
     * @return
     */
    @PostMapping("/user/updatetel")
    R updateUserTel(@RequestBody LoginTeDto loginTeVo);

    /**
     * 人脸识别建档
     * @param loginFaceVo
     * @return
     */
    @PostMapping("/user/face/create")
    R createUserFaceModel(@RequestBody LoginFaceDto loginFaceVo);

    /**
     * 人脸识别认证，判断是否是同一个人
     * @param loginFaceVo
     * @return
     */
    @PostMapping("/user/face/verify")
    R verifyUserFaceModel(@RequestBody LoginFaceDto loginFaceVo);

    /**
     * 修改用户信息
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/info/update")
    R updateUserModel(@RequestBody UserDto userDto);

    /**
     * 根据id查询用户信息
     * @param userId
     * @return
     */
    @PostMapping("/user/get/{userId}")
    R getUserInfo(@PathVariable("userId") Long userId);

    /**
     * 用户提现
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoney")
    R takeMoney(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - 悲观锁
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneypessimism")
    R takeMoneyPessimismLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - 乐观锁
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneyoptimism")
    R takeMoneyOptimismLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redis不可重入
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneyredis")
    R takeMoneyRedisLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - zookeeper不可重入
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneyzookeeper")
    R takeMoneyZookeeperLock(@RequestBody UserAmountVo userAmountVo);

    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redisson可重入
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneyredisson")
    R takeMoneyRedissonLock(@RequestBody UserAmountVo userAmountVo);


    /**
     * 用户提现
     * 数据库-分布式锁解决方案 - redisson不可重入
     * @return
     * @paramp loginVo
     */
    @PostMapping("/user/takemoneyredissontrylock")
    R takeMoneyRedissonTryLock(@RequestBody UserAmountVo userAmountVo);
}
